package com.dfbz.demo03_动态代理;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @author lscl
 * @version 1.0
 * @intro:
 */
public class Demo01 {
    public static void main(String[] args) {

//        UserService userService = new UserServiceImpl();
//        userService.save();

        // 1. 与目标对象一样的类加载器
        ClassLoader classLoader = Demo01.class.getClassLoader();

        // 2. 目标对象实现了哪些接口得告诉我
        Class[] classes = new Class[]{UserService.class};

        // 3. 调度类
        InvocationHandler handler = new InvocationHandler() {
            /**
             *
             * @param proxy: 代理对象
             * @param method: 目标对象执行的方法
             * @param args: 代理对象在执行方法传递给方法的参数
             * @return
             * @throws Throwable
             */
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {


                String name = method.getName();

                if (name.equals("save")) {
                    System.out.println("save方法的增强");
                }

                if (name.equals("delete")) {
                    System.out.println("delete方法的增强");
                }

                if (name.equals("query")) {
                    System.out.println("query方法的增强");
                }

                Object res = method.invoke(new UserServiceImpl(), args);


//                Object res = method.invoke(new UserServiceImpl(), args);

                return res;
            }
        };

        // 根据参数返回一个代理类
        UserService userServiceProxy = (UserService) Proxy.newProxyInstance(classLoader, classes, handler);
        userServiceProxy.delete(10);
    }
}
